package model;

/**
 * *********************************************************************
 * Module: Case.java Author: epulapp Purpose: Defines the Class Case
 **********************************************************************
 */
public class Case {

    private int posX;
    private int posY;
    private Environnement env;
    private Cellule cell;
    

    public Case(int x, int y, Environnement env) {
        this.posX = x;
        this.posY = y;
        this.env = env;
        cell = new Cellule(30);
    }

    private boolean getEtatNP1(Case[] tabVoisine) {

        int compteurVivante = 0;
        for (Case caseTemp : tabVoisine) {
            if (caseTemp != null) {
               
                if (caseTemp != null && caseTemp.getCell().getEtatN()) {
                    compteurVivante++;
                    
                }
            }
        }
        //System.out.println("Case :" + this.getPosX() + " " + this.getPosY()+ " | Nb voisins : "+compteurVivante);
        if (compteurVivante <= 3) 
        {
            //Une seule voisine ou 0 vivante
            if (compteurVivante < 2) {
                return false;
            } // Trois cellules voisines... On nait ! 
            else if (compteurVivante == 3) {
                 return true;
            }
            else if(compteurVivante == 2 && this.getCell().getEtatN()) {
                return true;
            }
        }        
        return false;

    }

    public void calculEtatSuivant() {
        boolean etat = this.getEtatNP1(this.env.getVoisine(this));
        this.cell.setEtatNP1(etat);
        
    }

    public void maj() {
        this.cell.setEtatN(this.cell.getEtatNP1());
        this.cell.setEtatNP1(false);
    }

    public int getPosX() {
        return posX;
    }

    public void changeEtat()
    {
        this.cell.setEtatN(!this.cell.getEtatN());
        System.out.println("Changement d'état en cours...");
        this.env.sendNotification();
    }
    
    public void setPosX(int newPosX) {
        posX = newPosX;
    }

    public Cellule getCell() {
        return cell;
    }

    public void setCell(Cellule newCell) {
        cell = newCell;
    }

    public int getPosY() {
        return posY;
    }

    public void setPosY(int newPosY) {
        posY = newPosY;
    }

    public Environnement getEnv() {
        return env;
    }

    public void setEnv(Environnement newEnv) {
        env = newEnv;
    }
}